import { z } from 'zod';
import * as fs from 'fs';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { fetchUrl, sendImageRequestByUrl } from './fetch-url';
import os from 'os'
import path from 'path'
import { svg2png } from './svg2png';

const desktopPath = path.join(os.homedir(), 'Desktop')

const server = new McpServer({
    name: 'get-img',
    title: 'get img url from masterGo',
    version: '1.0.0',
    description: '自动处理MasterGo链接和图片URL，转换为360域名的图片链接。当用户提供MasterGo链接时，自动转SVG→PNG→图床URL；网络图片直接转图床URL'
}, {
    capabilities: {}
});

server.registerPrompt(
    "get-img-system",
    {
        title: "图片URL获取系统指令",
        description: "系统级别的图片处理指令，会在每次使用此MCP时自动应用。这是一个自动激活的系统指令，用于处理MasterGo链接和图片URL转换。",
        argsSchema: {},
    },
    () => {
        return {
            messages: [{
                role: "user",
                content: {
                    type: "text",
                    text: `你是一个专门处理图片URL的助手。当用户提供图片链接时，你必须按照以下规则自动处理：

**核心处理规则：**

1. **MasterGo链接处理流程：**
   - 检测到MasterGo链接时，首先使用MasterGo MCP获取DSL数据并转换成SVG
   - 将SVG保存到桌面（文件名：temp.svg）
   - 使用svgToPng工具将SVG转换为PNG
   - 使用getImgUrl通过图床获取PNG的URL
   - 清理所有临时文件

2. **网络图片URL处理：**
   - 直接使用getImgUrl通过图床返回图片URL

**重要操作规范：**
- 所有临时文件必须保存在桌面上
- 使用绝对路径操作桌面文件
- 临时文件统一命名为temp.xxx格式
- 处理完成后必须清除所有临时文件
- 自动检测用户输入中的MasterGo链接或图片URL请求

**可用工具：**
- saveFileToDesktop: 保存文件到桌面
- deleteFileFromDesktop: 删除桌面文件  
- getImgUrl: 通过图床获取图片URL
- svgToPng: 将SVG转换为PNG

当检测到相关请求时，立即开始处理，无需等待用户确认。`
                }
            }]
        }
    }
);

server.registerTool('deleteFileFromDesktop', {
    title: '删除桌面上的文件',
    description: '删除桌面上指定名称的文件',
    inputSchema: {
        fileName: z.string().describe('文件名')
    },
}, ({ fileName }) => {
    const filePath = path.join(desktopPath, fileName);
    try {
        if (!fs.existsSync(filePath)) {
            return {
                content: [
                    {
                        type: 'text',
                        text: `文件 ${fileName} 不存在于桌面！`
                    }
                ]
            };
        }
        fs.unlinkSync(filePath);
        return {
            content: [
                {
                    type: 'text',
                    text: `文件 ${fileName} 删除成功！`
                }
            ]
        };
    } catch (error) {
        return {
            content: [
                {
                    type: 'text',
                    text: `删除文件 ${fileName} 失败：${error.message}`
                }
            ]
        };
    }
});

server.registerTool('saveFileToDesktop', {
    title: '保存文件到桌面',
    description: '保存指定文件名和内容的文件到桌面',
    inputSchema: {
        fileName: z.string().describe('文件名'),
        content: z.string().describe('文件内容')
    },
}, ({ fileName, content }) => {
    const filePath = path.join(desktopPath, fileName);
    fs.writeFileSync(filePath, content);
    return {
        content: [
            {
                type: 'text',
                text: fileName + '创建成功！'
            }
        ]
    };
});

server.registerTool('getImgUrl', {
    title: '获取图片URL',
    description: '把图片url或本地图片通过图床获取图片的URL地址(只能处理png/jpg/gif 不能处理svg)',
    inputSchema: {
        url: z.string().describe('图片地址包括本地图片路径/网络图片url'),
    },
}, async ({ url }) => {
    let groupId = await sendImageRequestByUrl(url)
    for (const i of Array.from({ length: 10 }, (_, i) => i)) {
        const res = await fetchUrl(groupId)
        if (res?.URL?.length) {
            return {
                content: [
                    {
                        type: 'text',
                        text: '获取成功：' + res.URL[0]
                    }
                ]
            };
        } else {
            if (i === 10) {
                return {
                    content: [
                        {
                            type: 'text',
                            text: '获取失败！'
                        }
                    ]
                }
            }
            await new Promise(resolve => setTimeout(resolve, 1000));
        }
    }
    return {
        content: [
            {
                type: 'text',
                text: '获取失败！'
            }
        ]
    }
});

server.registerTool('svgToPng', {
    title: 'SVG转PNG',
    description: '将SVG文件转换为PNG格式',
    inputSchema: {
        fileName: z.string().describe('文件名'),
    },
}, async ({ fileName }) => {
    const filePath = path.join(desktopPath, fileName);
    await svg2png(filePath)
    return {
        content: [
            {
                type: 'text',
                text: 'png创建成功！'
            }
        ]
    };
});


//通信协议
const transport = new StdioServerTransport();

// 连接并输出服务状态
console.error('MCP get-img 服务启动中...');
server.connect(transport);
console.error('MCP get-img 服务已就绪，系统指令已激活');
